home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / catfiles.i < prev    next >
Text File  |  1997-10-26  |  19KB  |  640 lines

  1. IMPLEMENTATION MODULE CatFiles;
  2.  
  3. FROM SYSTEM      IMPORT ADDRESS, ADR, CAST, ASSEMBLER;
  4. FROM Void        IMPORT v;
  5.  
  6. IMPORT Strings;
  7.  
  8. IMPORT mtAlerts;
  9. IMPORT MagicDOS;
  10. IMPORT MagicSys;
  11. IMPORT MagicStrings;
  12. IMPORT CatTypes;
  13. IMPORT CatGlobal;
  14. IMPORT WildCards;
  15. IMPORT Mintbind;
  16. IMPORT FileSys;
  17. IMPORT MTE;
  18.  
  19. (* ErrorAlert neu implementiert. Diese Implementation spart > 2 kB Speicher ein!
  20.  *)
  21.  
  22. (*$L-*)
  23. PROCEDURE errorMessages ();
  24. BEGIN
  25.   ASSEMBLER
  26.     DC.W    MagicDOS.Error 
  27.     ACZ     'Gemdos-Fehler'
  28.     SYNC
  29.     DC.W    MagicDOS.EDrvNR 
  30.     ACZ     'Unbekanntes Laufwerk'
  31.     SYNC
  32.     DC.W    MagicDOS.EUnCmd 
  33.     ACZ     'Unbekannter Befehl'
  34.     SYNC
  35.     DC.W    MagicDOS.ECRC 
  36.     ACZ     'CRC Fehler'
  37.     SYNC
  38.     DC.W    MagicDOS.EBadRq 
  39.     ACZ     'Inkorrekte Anforderung'
  40.     SYNC
  41.     DC.W    MagicDOS.ESeek 
  42.     ACZ     'Seek Fehler'
  43.     SYNC
  44.     DC.W    MagicDOS.EMedia 
  45.     ACZ     'Unbekanntes Medium'
  46.     SYNC
  47.     DC.W    MagicDOS.ESecNF 
  48.     ACZ     'Sektor nicht gefunden'
  49.     SYNC
  50.     DC.W    MagicDOS.EPaper 
  51.     ACZ     'Kein Papier'
  52.     SYNC
  53.     DC.W    MagicDOS.EWritF 
  54.     ACZ     'Schreibfehler'
  55.     SYNC
  56.     DC.W    MagicDOS.EReadF 
  57.     ACZ     'Lesefehler'
  58.     SYNC
  59.     DC.W    MagicDOS.EGenrl 
  60.     ACZ     'Allgemeiner Fehler'
  61.     SYNC
  62.     DC.W    MagicDOS.EWrPro 
  63.     ACZ     'Schreibgeschtzt'
  64.     SYNC
  65.     DC.W    MagicDOS.EChng 
  66.     ACZ     'Medium gewechselt'
  67.     SYNC
  68.     DC.W    MagicDOS.EUnDev 
  69.     ACZ     'Unbekanntes Laufwerk'
  70.     SYNC
  71.     DC.W    MagicDOS.EBadSF 
  72.     ACZ     'Defekte Sektoren'
  73.     SYNC
  74.     DC.W    MagicDOS.EOther 
  75.     ACZ     'Andere Disk einlegen'
  76.     SYNC
  77.     DC.W    MagicDOS.EInvFN 
  78.     ACZ     'Ungltige GEMDOS-Funktion'
  79.     SYNC
  80.     DC.W    MagicDOS.EFilNF 
  81.     ACZ     'Datei nicht gefunden'
  82.     SYNC
  83.     DC.W    MagicDOS.EPthNF 
  84.     ACZ     'Pfad nicht gefunden'
  85.     SYNC
  86.     DC.W    MagicDOS.ENHndl 
  87.     ACZ     'GEMDOS hat keine|Dateihandles mehr'
  88.     SYNC
  89.     DC.W    MagicDOS.EAccDn 
  90.     ACZ     'Zugriff nicht m”glich'
  91.     SYNC
  92.     DC.W    MagicDOS.EIHndl 
  93.     ACZ     'Ungltiges Handle'
  94.     SYNC
  95.     DC.W    MagicDOS.ENSMem 
  96.     ACZ     'Unzureichender Speicher'
  97.     SYNC
  98.     DC.W    MagicDOS.EIMBA 
  99.     ACZ     'Ungltige Speicherblockadresse'
  100.     SYNC
  101.  
  102.     DC.W    MagicDOS.EIMBA 
  103.     ACZ     'Ungltige Speicherblockadresse'
  104.     SYNC
  105.  
  106.     DC.W    MagicDOS.EDrive 
  107.     ACZ     'Ungltiges Laufwerk'
  108.     SYNC
  109.  
  110.     DC.W    MagicDOS.ENMFil 
  111.     ACZ     'Keine weiteren Dateien'
  112.     SYNC
  113.   
  114.   (* Netzwerk-Fehlercodes *)
  115.     DC.W    (* MagicDOS.ELOCKED *) -58 
  116.     ACZ     'File ist fr anderes|Programm reserviert. Zugriff|momentan nicht m”glich.'
  117.     SYNC
  118.     DC.W    (* MagicDOS.ENSLOCK *) -59 
  119.     ACZ     'Unlocking nicht m”glich.|(Falsche Recordangaben)'
  120.     SYNC
  121.  
  122.     DC.W    MagicDOS.ERange 
  123.     ACZ     'Bereichsberschreitung'
  124.     SYNC
  125.     DC.W    MagicDOS.EIntrn 
  126.     ACZ     'Interner Fehler'
  127.     SYNC
  128.     DC.W    MagicDOS.EPLFmt 
  129.     ACZ     'Ungltiges Programmladeformat'
  130.     SYNC
  131.     DC.W    MagicDOS.EGSBF 
  132.     ACZ     'Setblock failure due|to growth restriction'
  133.     SYNC
  134. (*
  135.     DC.W    BuffUsed 
  136.     ACZ     'Interner Puffer belegt'
  137.     SYNC
  138.     DC.W    BuffNotUsed 
  139.     ACZ     'Interner Puffer leer'
  140.     SYNC
  141.     DC.W    FileEmpty 
  142.     ACZ     'Leere Datei'
  143.     SYNC
  144.     DC.W    EOF 
  145.     ACZ     'šberraschendes Fileende'
  146.     SYNC
  147. *)
  148.     DC.W    notAllWritten 
  149.     ACZ     'Nicht alle|Daten geschrieben.|Evtl. Platte voll?'
  150.     SYNC
  151.     DC.W    notAllRead 
  152.     ACZ     'Ein Lesefehler ist aufgetreten,|es wurden nicht alle|Daten gelesen.'
  153.     SYNC
  154.     DC.W    crcError 
  155.     ACZ     'CRC-Fehler in der|Datenbank.'
  156.     SYNC
  157.     ; Endemarke:
  158.     DC.L    0
  159.   END;
  160. END errorMessages;
  161. (*$L=*)
  162.  
  163. PROCEDURE GetErrorMsg (nr: INTEGER; VAR str: ARRAY OF CHAR);
  164.   VAR adr : CatTypes.Str255Ptr;
  165. BEGIN
  166.   (* Erstmal in errorMessages nach der Nummer suchen und dann
  167.    * ber die Stringadresse zuweisen
  168.    *)
  169.   adr := NIL;
  170.   (* Ginge auch in M2, aber so ist es einfacher :-)) *)
  171.   ASSEMBLER
  172.     LEA     errorMessages,A0
  173.     MOVE.W  nr(A6),D0
  174. check:
  175.     MOVE.W  (A0)+,D1
  176.     CMP.W   D0,D1
  177.     BEQ.S   found
  178.     ; Jetzt Bytes skippen, bis wir ein 0-Byte gefunden haben
  179. skip:
  180.     TST.B   (A0)+
  181.     BNE.S   skip
  182.     ; Adresse testen, ob sie gerade ist
  183.     MOVE.L  A0,D1
  184.     BTST    #0,D1
  185.     BEQ.S   noAdd
  186.     ; Ungerade Adresse, 1 draufaddieren
  187.     ADDQ.L  #1,D1
  188.     MOVEA.L D1,A0
  189. noAdd:
  190.     ; test auf Endemarke
  191.     TST.L   (A0)
  192.     BNE.S   check
  193.     BRA.S   nfound
  194.  found:
  195.     MOVE.L  A0,adr(A6)
  196.  nfound:
  197.   END;
  198.   IF adr # NIL
  199.   THEN
  200.     MagicStrings.Assign (adr^, str);
  201.     IF (nr < 0) & (nr > -100) 
  202.     THEN 
  203.       MagicStrings.Append ('|GemDos &', str);
  204.     END;
  205.   ELSE
  206.     MagicStrings.Assign ('Unbekannter Fehler!|GemDos &', str);
  207.   END;
  208. END GetErrorMsg;
  209.  
  210. PROCEDURE ErrorAlert(nr : INTEGER);
  211.   VAR alt : CatTypes.String255;
  212. BEGIN
  213.   (* Fehlermeldung holen *)
  214.   IF nr = MagicDOS.EOK THEN RETURN
  215.   ELSE
  216.     GetErrorMsg (nr, alt);
  217.     (* Anfang vom Alert *)
  218.     MagicStrings.Insert ('[3][|', alt, 0);
  219.     (* Ende vom Alert *)
  220.     MagicStrings.Append ('][[Abbruch]', alt);
  221.     MTE.numAlert(nr, alt);
  222.   END;
  223. (*  
  224.   (* Soll Mal fr alle Fehlermeldungen zust„ndig sein *)
  225.   IF nr = MagicDOS.EOK THEN RETURN
  226.   ELSIF nr = MagicDOS.Error THEN
  227.     v.int := mtAlerts.Alert(1, '[3][|Gemdos-Fehler|GemDos -1][[Abbruch]');
  228.   ELSIF nr = MagicDOS.EDrvNR THEN
  229.     v.int := mtAlerts.Alert(1, '[3][|Unbekanntes Laufwerk|GemDos -2][[Abbruch]');
  230.   ELSIF nr = MagicDOS.EUnCmd THEN
  231.     v.int := mtAlerts.Alert(1, '[3][|Unbekannter Befehl|GemDos -3][[Abbruch]');
  232.   ELSIF nr = MagicDOS.ECRC THEN
  233.     v.int := mtAlerts.Alert(1, '[3][|CRC Fehler|GemDos -4][[Abbruch]');
  234.   ELSIF nr = MagicDOS.EBadRq THEN
  235.     v.int := mtAlerts.Alert(1, '[3][|Inkorrekte Anforderung|GemDos -5][[Abbruch]');
  236.   ELSIF nr = MagicDOS.ESeek THEN
  237.     v.int := mtAlerts.Alert(1, '[3][|Seek Fehler|GemDos -6][[Abbruch]');
  238.   ELSIF nr = MagicDOS.EMedia THEN
  239.     v.int := mtAlerts.Alert(1, '[3][|Unbekanntes Medium|GemDos -7][[Abbruch]');
  240.   ELSIF nr = MagicDOS.ESecNF THEN
  241.     v.int := mtAlerts.Alert(1, '[3][|Sektor nicht gefunden|GemDos -8][[Abbruch]');
  242.   ELSIF nr = MagicDOS.EPaper THEN
  243.     v.int := mtAlerts.Alert(1, '[3][|Kein Papier|GemDos -9][[Abbruch]');
  244.   ELSIF nr = MagicDOS.EWritF THEN
  245.     v.int := mtAlerts.Alert(1, '[3][|Schreibfehler|GemDos -10][[Abbruch]');
  246.   ELSIF nr = MagicDOS.EReadF THEN
  247.     v.int := mtAlerts.Alert(1, '[3][|Lesefehler|GemDos -11][[Abbruch]');
  248.   ELSIF nr = MagicDOS.EGenrl THEN
  249.     v.int := mtAlerts.Alert(1, '[3][|Allgemeiner Fehler|GemDos -12][[Abbruch]');
  250.   ELSIF nr = MagicDOS.EWrPro THEN
  251.     v.int := mtAlerts.Alert(1, '[3][|Schreibgeschtzt|GemDos -13][[Abbruch]');
  252.   ELSIF nr = MagicDOS.EChng THEN
  253.     v.int := mtAlerts.Alert(1, '[3][|Medium gewechselt|GemDos -14][[Abbruch]');
  254.   ELSIF nr = MagicDOS.EUnDev THEN
  255.     v.int := mtAlerts.Alert(1, '[3][|Unbekanntes Laufwerk|GemDos -15][[Abbruch]');
  256.   ELSIF nr = MagicDOS.EBadSF THEN
  257.     v.int := mtAlerts.Alert(1, '[3][|Defekte Sektoren|GemDos -16][[Abbruch]');
  258.   ELSIF nr = MagicDOS.EOther THEN
  259.     v.int := mtAlerts.Alert(1, '[3][|Andere Disk einlegen|GemDos -17][[Abbruch]');
  260.  
  261.   ELSIF nr = MagicDOS.EInvFN THEN
  262.     v.int := mtAlerts.Alert(1, '[3][|Falsche Funktionsnummer|GemDos -32][[Abbruch]');
  263.   ELSIF nr = MagicDOS.EFilNF THEN
  264.     v.int := mtAlerts.Alert(1, '[3][|Datei nicht gefunden|GemDos -33][[Abbruch]');
  265.   ELSIF nr = MagicDOS.EPthNF THEN
  266.     v.int := mtAlerts.Alert(1, '[3][|Pfad nicht gefunden|GemDos -34][[Abbruch]');
  267.   ELSIF nr = MagicDOS.ENHndl THEN
  268.     v.int := mtAlerts.Alert(1, '[3][|GEMDOS hat keine|Dateihandles mehr|GemDos -35][[Abbruch]');
  269.   ELSIF nr = MagicDOS.EAccDn THEN
  270.     v.int := mtAlerts.Alert(1, '[3][|Zugriff nicht m”glich|GemDos -36][[Abbruch]');
  271.   ELSIF nr = MagicDOS.EIHndl THEN
  272.     v.int := mtAlerts.Alert(1, '[3][|Ungltiges Handle|GemDos -37][[Abbruch]');
  273.  
  274.   ELSIF nr = MagicDOS.ENSMem THEN
  275.       v.int := mtAlerts.Alert(1, '[3][|Unzureichender Speicher|GemDos -39][[Abbruch]');
  276.   ELSIF nr = MagicDOS.EIMBA THEN
  277.     v.int := mtAlerts.Alert(1, '[3][|Ungltige Speicherblockadresse|GemDos -40][[Abbruch]');
  278.  
  279.   ELSIF nr = MagicDOS.EIMBA THEN
  280.     v.int := mtAlerts.Alert(1, '[3][|Ungltige Speicherblockadresse|GemDos -40][[Abbruch]');
  281.  
  282.   ELSIF nr = MagicDOS.EDrive THEN
  283.     v.int := mtAlerts.Alert(1, '[3][|Ungltiges Laufwerk|GemDos -46][[Abbruch]');
  284.  
  285.   ELSIF nr = MagicDOS.ENMFil THEN
  286.     v.int := mtAlerts.Alert(1, '[3][|Keine weiteren Dateien|GemDos -49][[Abbruch]');
  287.   
  288.   (* Netzwerk-Fehlercodes *)
  289.   ELSIF nr = (* MagicDOS.ELOCKED *) -58 THEN
  290.     v.int := mtAlerts.Alert (1, '[3][|File ist fr anderes|Programm reserviert. Zugriff|momentan nicht m”glich.|GemDos -58][[Abbruch]');
  291.   ELSIF nr = (* MagicDOS.ENSLOCK *) -59 THEN
  292.     v.int := mtAlerts.Alert (1, '[3][|Unlocking nicht m”glich.|(Falsche Recordangaben)|GemDos - 59][[Abbruch]');
  293.  
  294.   ELSIF nr = MagicDOS.ERange THEN
  295.     v.int := mtAlerts.Alert(1, '[3][|Bereichsberschreitung|GemDos -64][[Abbruch]');
  296.   ELSIF nr = MagicDOS.EIntrn THEN
  297.     v.int := mtAlerts.Alert(1, '[3][|Interner Fehler|GemDos -65][[Abbruch]');
  298.   ELSIF nr = MagicDOS.EPLFmt THEN
  299.     v.int := mtAlerts.Alert(1, '[3][|Ungltiges Programmladeformat|GemDos -66][[Abbruch]');
  300.   ELSIF nr = MagicDOS.EGSBF THEN
  301.     v.int := mtAlerts.Alert(1, '[3][|Setblock failure due|to growth restriction|GemDos -67][[Abbruch]');
  302. (*
  303.   ELSIF nr = BuffUsed THEN
  304.     v.int := mtAlerts.Alert(1, '[3][|Interner Puffer belegt][[Abbruch]');
  305.   ELSIF nr = BuffNotUsed THEN
  306.     v.int := mtAlerts.Alert(1, '[3][|Interner Puffer leer][[Abbruch]');
  307.   ELSIF nr = FileEmpty THEN
  308.     v.int := mtAlerts.Alert(1, '[3][|Leere Datei][[Abbruch]');
  309.   ELSIF nr = EOF THEN
  310.     v.int := mtAlerts.Alert(1, '[3][|šberraschendes Fileende][[Abbruch]');
  311. *)
  312.   ELSIF nr = notAllWritten THEN
  313.     v.int := mtAlerts.Alert(1, '[3][|Nicht alle|Daten geschrieben.|Evtl. Platte voll?][[Abbruch]');
  314.   ELSIF nr = notAllRead THEN
  315.     v.int := mtAlerts.Alert(1, '[3][|Ein Lesefehler ist aufgetreten,|es wurden nicht alle|Daten gelesen.][[Abbruch]');
  316.   ELSIF nr = crcError THEN
  317.     v.int := mtAlerts.Alert(1, '[3][|CRC-Fehler in der|Datenbank.][[Abbruch]');
  318.  
  319.   ELSE
  320.     MTE.numAlert(nr, '[3][|Unbekannter Fehler|GemDos &][[Abbruch]');
  321.   END;
  322. *)
  323. END ErrorAlert;
  324. (*
  325.   PROCEDURE stopSearch():BOOLEAN;
  326.   VAR dum        : LONGCARD;
  327.   BEGIN
  328.     IF MagicDOS.Cconis() THEN
  329.       dum := MagicDOS.Crawin();
  330.       RETURN SHORT(dum) = 32  (* esc char *)
  331.     ELSE
  332.       RETURN FALSE
  333.     END;
  334.   END stopSearch;
  335. *)
  336.  
  337.  
  338. PROCEDURE OpenFile(REF path, name : ARRAY OF CHAR; mode : openMode):INTEGER;
  339. VAR handle : INTEGER;
  340.     MODE   : BITSET;
  341.     file   : CatTypes.String255;
  342. BEGIN
  343.   FileError := NoError;
  344.   CASE mode OF
  345.     readFile  : MODE := BITSET(MagicDOS.Read)|
  346.     writeFile : MODE := {0}|
  347.     readWrite : MODE := {1};  |
  348.   END;
  349.  
  350.   MagicStrings.Assign(path, file);
  351.   MagicStrings.Append(name, file);
  352.  
  353.   handle := MagicDOS.Fopen(file, MODE);
  354.   IF (handle = MagicDOS.EFilNF) & (mode # readFile) THEN
  355.     handle := MagicDOS.Fcreate(file, {});
  356.     IF mode = readWrite
  357.     THEN
  358.       FileError := MagicDOS.Fclose(handle);
  359.       handle := MagicDOS.Fopen(file, MODE);
  360.     END;
  361.   END;
  362.   IF handle < 0 THEN 
  363.     FileError := handle 
  364.   ELSE
  365.     FileError := NoError; 
  366.   END;
  367.   RETURN handle
  368. END OpenFile;
  369.  
  370. PROCEDURE CreateFile(REF path, name : ARRAY OF CHAR):INTEGER;
  371. VAR handle : INTEGER;
  372.     file   : CatTypes.String255;
  373. BEGIN
  374.   FileError := NoError;
  375.  
  376.   MagicStrings.Assign(path, file);
  377.   MagicStrings.Append(name, file);
  378.  
  379.   handle := MagicDOS.Fcreate(file, {});
  380.   IF handle < 0 THEN FileError := handle END;
  381.   RETURN handle
  382. END CreateFile;
  383.  
  384. PROCEDURE WriteFile(c : CHAR; handle : INTEGER);
  385. VAR count : LONGCARD;
  386. BEGIN
  387.   FileError := NoError;
  388.   count := 1;
  389.   MagicDOS.Fwrite(handle, count, ADR(c));
  390.   IF LONGINT(count) < 0 THEN
  391.     FileError := CAST(INTEGER,count)
  392.   ELSIF count # 1 THEN
  393.     FileError := notAllWritten;
  394.   END;
  395. END WriteFile;
  396.  
  397. PROCEDURE WriteMuch(howMuch : LONGCARD; handle : INTEGER; where : ADDRESS);
  398. VAR count : LONGCARD;
  399. BEGIN
  400. (*  IF stopSearch() THEN FileError := MagicDOS.EWritF; RETURN END; *)
  401.   FileError := NoError;
  402.   count := howMuch;
  403.   MagicDOS.Fwrite(handle, count, where);
  404.   IF LONGINT(count) < 0 THEN
  405.     FileError := CAST(INTEGER,count)
  406.   ELSIF count # howMuch THEN
  407.     FileError := notAllWritten;
  408.   END
  409. END WriteMuch;
  410.  
  411. PROCEDURE ReadFile(VAR c : CHAR; handle : INTEGER);
  412. VAR count : LONGCARD;
  413. BEGIN
  414.   FileError := NoError;
  415.   count := 1;
  416.   MagicDOS.Fread(handle, count, ADR(c));
  417.   IF LONGINT(count) < 0 THEN
  418.     FileError := CAST(INTEGER,count)
  419.   ELSIF count # 1 THEN
  420.     FileError := notAllRead;
  421.   END;
  422. END ReadFile;
  423.  
  424. PROCEDURE ReadMuch(howMuch : LONGCARD; handle : INTEGER; where : ADDRESS);
  425. VAR count : LONGCARD;
  426. BEGIN
  427. (*  IF stopSearch() THEN FileError := MagicDOS.EReadF; RETURN END; *)
  428.   FileError := NoError;
  429.   count := howMuch;
  430.   MagicDOS.Fread(handle, count, where);
  431.   IF LONGINT(count) < 0 THEN
  432.     FileError := CAST(INTEGER,count)
  433.   ELSIF count # howMuch THEN
  434.     FileError := notAllRead;
  435.   END;
  436. END ReadMuch;
  437.  
  438. PROCEDURE FilePos(handle : INTEGER):LONGCARD;
  439. VAR pos : LONGCARD;
  440. BEGIN
  441.   FileError := NoError;
  442.   pos := MagicDOS.Fseek(0, handle, MagicDOS.SeekPos);
  443.   IF LONGINT(pos) < 0 THEN FileError := CAST(INTEGER,pos) END;
  444.   RETURN pos
  445. END FilePos;
  446.  
  447. PROCEDURE Seek(pos : LONGINT; handle : INTEGER; what : SeekMode);
  448. VAR err : LONGCARD;
  449. BEGIN
  450.   FileError := NoError;
  451.   CASE what OF
  452.     start    : err := MagicDOS.Fseek(pos, handle, MagicDOS.SeekStart)|
  453.     relative : err := MagicDOS.Fseek(pos, handle, MagicDOS.SeekPos)|
  454.     end      : err := MagicDOS.Fseek(pos, handle, MagicDOS.SeekEnd)|
  455.   END;
  456. (* Hier fragt sowieso keiner, aužerdem ist mir nicht klar, wie man unterscheiden kann,
  457.    ob ein Fehler im unteren Wort steht, ohne daž es zu Fehlinterpretationen kommen kann.
  458.    Was ist mit Seek auf CARDINAL(-37), das ist doch ohne weiteres M”glich.. grr
  459.   IF err < 0 THEN FileError := CAST(INTEGER,pos) END;
  460. *)
  461. END Seek;
  462.  
  463. PROCEDURE CloseFile(handle : INTEGER);
  464. BEGIN
  465.   FileError :=  MagicDOS.Fclose(handle);
  466. END CloseFile;
  467.  
  468. PROCEDURE SetPath(REF path : ARRAY OF CHAR):BOOLEAN;
  469.   VAR drv : CHAR;
  470. BEGIN
  471.   IF path[1] = ':' THEN
  472.     drv := CAP(path[0]);
  473.     MagicDOS.Dsetdrv(ORD(drv)-ORD('A'), v.lbset)
  474.   END;
  475.   RETURN MagicDOS.Dsetpath(path) = 0
  476. END SetPath;
  477.  
  478. PROCEDURE GetPath(VAR path : ARRAY OF CHAR);
  479.   VAR drive : CARDINAL;
  480. BEGIN
  481.   drive := MagicDOS.Dgetdrv();
  482.   MagicDOS.Dgetpath (path, drive+1);
  483.   MagicStrings.Insert ('A:', path, 0);
  484.   MagicStrings.Append ('\', path);
  485.   path[0] := CHR(ORD('A')+drive);
  486. END GetPath;
  487.  
  488.  
  489. PROCEDURE ClearPath(REF path, mask, lock : ARRAY OF CHAR);
  490. TYPE DTAType = RECORD res : ARRAY[0..29] OF CHAR; name : ARRAY[0..13] OF CHAR END;
  491. VAR DTAPtr : POINTER TO DTAType;
  492.     notAll : BOOLEAN;
  493.     tmp,
  494.     readmask   : CatTypes.String1023;
  495.     toLower    : BOOLEAN;
  496.     firstFound : BOOLEAN;
  497.     dHandle    : LONGINT;
  498.     nPtr       : CatTypes.Str1023Ptr;
  499.     xattr      : FileSys.XATTR;
  500.     err        : LONGINT;
  501. BEGIN
  502.   IF ~CatGlobal.isMintDomain
  503.   THEN
  504.     IF SetPath(path) THEN
  505.       DTAPtr := ADDRESS(MagicDOS.Fgetdta());
  506.       IF MagicDOS.Fsfirst (mask, {}) >= 0 THEN
  507.         REPEAT
  508.           IF ~MagicStrings.Equal(DTAPtr^.name, lock) THEN
  509.             IF ~MagicDOS.Fdelete(DTAPtr^.name) THEN
  510.               ErrorAlert(MagicDOS.EAccDn)
  511.             END;
  512.           END;
  513.         UNTIL MagicDOS.Fsnext() < 0;
  514.       END;
  515.     ELSE
  516.       ErrorAlert(MagicDOS.EPthNF)
  517.     END;
  518.   ELSE
  519.     dHandle := Mintbind.Dopendir (path, 0);
  520.     IF dHandle >= 0
  521.     THEN
  522.       nPtr := ADR (readmask[4]);
  523.       firstFound := TRUE;
  524.       toLower    := TRUE;
  525.       REPEAT
  526.         err := Mintbind.Dreaddir (dHandle, readmask);
  527.         IF err = 0
  528.         THEN
  529.           IF firstFound 
  530.           THEN
  531.             (* Get attributes of file, follow link *)
  532.             MagicStrings.Assign (path, tmp);
  533.             MagicStrings.Append (nPtr^, tmp);
  534.             toLower := 0 # (Mintbind.Dpathconf (tmp, 6));
  535.             firstFound := FALSE;
  536.           END;
  537.           IF toLower
  538.           THEN
  539.             Strings.Lower (nPtr^);
  540.             (*$W-*)
  541.             Strings.Lower (mask);
  542.             Strings.Lower (lock);
  543.             (*$W=*)
  544.           END;
  545.           (* Compare name, in den ersten 4 Bytes steht der inode *)
  546.           IF WildCards.NameMatching (nPtr^, mask)
  547.           THEN
  548.             IF ~WildCards.NameMatching (nPtr^, lock)
  549.             THEN
  550.               MagicStrings.Assign (path, tmp);
  551.               MagicStrings.Append (nPtr^, tmp);
  552.               IF ~MagicDOS.Fdelete(tmp) THEN
  553.                 ErrorAlert(MagicDOS.EAccDn)
  554.               END;
  555.             END;
  556.           END;
  557.         END;
  558.       UNTIL err # 0;
  559.       IF (err # MagicDOS.ENMFil)
  560.       &  (err # MagicDOS.EFilNF)
  561.       THEN
  562.         ErrorAlert (SHORT (err));
  563.       END;
  564.       v.lint := Mintbind.Dclosedir (dHandle);
  565.     ELSE
  566.       ErrorAlert(MagicDOS.EPthNF)
  567.     END;
  568.   END;
  569. END ClearPath;
  570.  
  571. PROCEDURE DeleteFile(REF path, name : ARRAY OF CHAR):BOOLEAN;
  572. VAR file : CatTypes.String255;
  573. BEGIN
  574.   MagicStrings.Assign(path, file);
  575.   MagicStrings.Append(name, file);
  576.   RETURN MagicDOS.Fdelete(file)
  577. END DeleteFile;
  578.  
  579. PROCEDURE RenameFile(REF path, name, path2, name2 : ARRAY OF CHAR):BOOLEAN;
  580. VAR file : CatTypes.String255;
  581. BEGIN
  582.   IF SetPath(path) THEN
  583.     MagicStrings.Assign(path2, file);
  584.     MagicStrings.Append(name2, file);
  585.     (*$W-*)
  586.     RETURN MagicDOS.Frename(name, file) > 0
  587.     (*$W=*)
  588.   ELSE
  589.     RETURN FALSE
  590.   END;
  591. END RenameFile;
  592.  
  593. PROCEDURE FileSizeAndDate (REF fname : ARRAY OF CHAR; VAR exists: BOOLEAN;
  594.                            VAR date, time: CARDINAL) : LONGCARD;
  595.   VAR oDta: ADDRESS;
  596.       dta : MagicDOS.DTA;
  597.       res : INTEGER;
  598.       err : LONGINT;
  599.       xattr : FileSys.XATTR;
  600. BEGIN
  601.   IF ~CatGlobal.isMintDomain
  602.   THEN
  603.     oDta := MagicDOS.Fgetdta ();
  604.     MagicDOS.Fsetdta (ADR(dta));
  605.     res := MagicDOS.Fsfirst (fname, {});
  606.     MagicDOS.Fsetdta (oDta);
  607.     exists := res = 0;
  608.     IF res # 0 THEN RETURN 0 END;
  609.     date := dta.dDate;
  610.     time := dta.dTime;
  611.     RETURN dta.dLength;
  612.   ELSE
  613.     err := Mintbind.Fxattr (0, fname, xattr);
  614.     IF err = 0
  615.     THEN
  616.       exists := TRUE;
  617.       date := CARDINAL(xattr.mdate);
  618.       time := CARDINAL(xattr.mtime);
  619.       RETURN LONGCARD(xattr.size);
  620.     END; 
  621.     exists := FALSE;
  622.     RETURN 0;
  623.   END;
  624. END FileSizeAndDate; 
  625.  
  626. PROCEDURE FileSize (REF fname : ARRAY OF CHAR; VAR exists: BOOLEAN) : LONGCARD;
  627. BEGIN
  628.   RETURN FileSizeAndDate (fname, exists, v.card, v.card);
  629. END FileSize;
  630.  
  631. PROCEDURE Exists (REF fname: ARRAY OF CHAR): BOOLEAN;
  632.   VAR bla   : LONGCARD;
  633.       res   : BOOLEAN;
  634. BEGIN
  635.   bla := FileSize (fname, res);
  636.   RETURN res;
  637. END Exists;
  638.  
  639. END CatFiles.
  640.